Репозиторії та робота з базами даних (@Repository, JPA, Hibernate)
У Spring Boot репозиторії використовуються для взаємодії з базами даних. Найчастіше застосовується Spring Data JPA, яка спрощує роботу з ORM (Object-Relational Mapping) завдяки Hibernate. JPA дозволяє абстрагуватися від конкретного механізму роботи з базами даних і зменшує обсяг написаного коду.
1. Анотація @Repository
Анотація @Repository позначає клас, який працює з базою даних. Spring автоматично реєструє такі компоненти.
Репозиторій слугує рівнем абстракції між бізнес-логікою та базою даних, що полегшує тестування і підтримку коду.
@Repository
public interface UserRepository extends JpaRepository {
List findByName(String name);
Optional findByEmail(String email);
}
2. Використання JPA
JPA (Java Persistence API) дозволяє працювати з сутностями бази даних через об'єктно-реляційне відображення (ORM). Це означає, що ми можемо працювати з базою даних за допомогою Java-об'єктів без прямого написання SQL-запитів.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
}
3. Конфігурація бази даних
Приклад конфігурації для MySQL у application.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=pass
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
Можливі значення spring.jpa.hibernate.ddl-auto:
- create – створює таблиці щоразу при старті додатка.
- create-drop – створює таблиці, а при завершенні роботи – видаляє.
- update – оновлює структуру таблиць без видалення даних.
- validate – перевіряє відповідність схем без внесення змін.
4. Використання у сервісному шарі
Репозиторій можна використовувати у сервісі для отримання, збереження та оновлення даних.
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public List getAllUsers() {
return userRepository.findAll();
}
public Optional getUserByEmail(String email) {
return userRepository.findByEmail(email);
}
public User createUser(User user) {
return userRepository.save(user);
}
}
5. Виконання SQL-запитів вручну
Spring Data JPA дозволяє виконувати кастомні SQL-запити через анотацію @Query:
@Repository
public interface UserRepository extends JpaRepository {
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmailCustom(@Param("email") String email);
}
Назад Далі